package org.example.memora.service;

import org.example.memora.common.constant.RedisConstants;
import org.example.memora.mapper.PostMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Component
public class FreshPostsScheduler {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private PostMapper postMapper;

    /**
     * 每小时整点刷新一次新鲜帖子列表
     * Cron 表达式：秒 分 时 日 月 周
     * 这里表示：每小时的第 0 分 0 秒执行
     */
    @Scheduled(cron = "0 0 * * * *")
    // 每分钟第 0 秒执行一次，方便测试
    //@Scheduled(cron = "0 * * * * *")
    public void refreshFreshPosts() {
        System.out.println("开始刷新新鲜帖子列表...");
        // 1. 删除旧列表
        redisTemplate.delete(RedisConstants.FRESH_POSTS_KEY);

        // 2. 从数据库查询最新的 N 条帖子的 ID
        //    这里 N 可以写死，也可以用 @Value 从配置文件读取
        int freshCount = 100;  // 举例：每次拉 50 条
        List<String> latestIds = postMapper.selectLatestPostIds(freshCount);

        if (latestIds == null || latestIds.isEmpty()) {
            return;
        }

        // 3. 按最新到最旧的顺序推入 Redis List
        //    LPUSH 会把第一个元素放在最左侧，所以我们要反序遍历
        for (int i = latestIds.size() - 1; i >= 0; i--) {
            redisTemplate.opsForList()
                    .leftPush(RedisConstants.FRESH_POSTS_KEY, latestIds.get(i));
        }

        // （可选）设置一个过期时间，防止异常情况下一直保留
        redisTemplate.expire(RedisConstants.FRESH_POSTS_KEY, 2, TimeUnit.HOURS);
    }
}
